﻿/*
 * Created on 2006-2-15
 */
package com.wsj.util.page;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;


/**
 * @author admin
 *
 */
public class PerfectPageResultSet {
	/**
	 * Logger for this class
	 */
	private static final Log logger = LogFactory
			.getLog(PerfectPageResultSet.class);

	/**
	 * 结果的记录对象
	 */
	PageResultSet prs = new PageResultSet();

	/**
	 * 构造函数
	 *
	 */
	public PerfectPageResultSet() {
	}

	/**
	 * 设置需要转到的当前页数
	 * @param page  当前页数
	 */
	public void setPage(int page,int pageSize) {
		if (page < 1)
			page = 1;
		prs.setCurPage(page);
		prs.setPageSize(pageSize);
	}

	/**
	 * 根据两个查询条件查询出需要的结果集合列表
	 * @param hql  用来查询符合条件的hql语句
	 * @param session  一个数据库会话对象
	 * @return  需要的结果集合
	 */
	public PageResultSet pageResultSet(String hql, Session session) {
		try {
			//获取当前页数记录数开始数
			int srow = (prs.getCurPage() - 1) * prs.getPageSize() + 1;
			String fromClause = hql;
			//order 也可能是大写
			int ii = hql.toLowerCase().indexOf("order by");
			//判断是否有order by 子句
			if (ii > 0)
				fromClause = hql.substring(0, ii);
			//获取记录数语句
			String l_str = "select count(*) " + fromClause;
			//获取记录数
			Query _q = session.createQuery(l_str);
			List _rn = _q.list();
			int recNum = ((Integer) _rn.get(0)).intValue();
			//设置记录数
			prs.setRecordNum(recNum);
			//如果显示页数大于记录数,显示所有记录
			if (srow > recNum) {
				srow = (prs.getAllPage() - 1) * PageResultSet.PAGESIZE + 1;
				prs.setCurPage(prs.getAllPage());

			}
			Query q = session.createQuery(hql);
			q.setFirstResult(srow - 1);
			q.setMaxResults(prs.getPageSize());
			List l = q.list();
			prs.setStartRow(srow);
			prs.setResult(l);
			return prs;
		} catch (HibernateException ex) {
			ex.printStackTrace();
			return null;
		}
	}

	/**
	 * 设置查询语句..
	 * @param hql
	 * @param session
	 * @param values 参数列表
	 * @return
	 */
	public PageResultSet pageResultSet(String hql, Session session,
			String[] values) {		
		try {
			//获取页数
			int srow = (prs.getCurPage() - 1) * prs.getPageSize() + 1;
			//获取语句
			String fromClause = hql;
			//order 也可能是大写
			int ii = hql.toLowerCase().indexOf("order by");
			//判断是否有order by 子句
			if (ii > 0)
				fromClause = hql.substring(0, ii);
			//获取总记录数
			String l_str = "select count(*) " + fromClause;
			logger.debug("查询语句:"+l_str);
			Query _q = session.createQuery(l_str);
			//设置参数
            setParamValue(_q,values);
			List _rn = _q.list();
			int recNum = ((Integer) _rn.get(0)).intValue();
			logger.debug("获取总记录数:"+recNum);
			prs.setRecordNum(recNum);
			if (srow > recNum) {
				srow = (prs.getAllPage() - 1) * PageResultSet.PAGESIZE + 1;
				prs.setCurPage(prs.getAllPage());
				logger.debug("sdrow:" + srow);
			}
			//查询分页信息
			Query q = session.createQuery(hql);
			q.setFirstResult(srow - 1);
			q.setMaxResults(prs.getPageSize());
            //设置参数
            setParamValue(q,values);
			List l = q.list();
			prs.setStartRow(srow);
			//设置结果
			prs.setResult(l);
			return prs;
		} catch (HibernateException e) {
			e.printStackTrace();
			return null;
		}
	}

	private void setParamValue(Query p__q, String[] p_values) {
		if(p_values!=null){
			for (int i = 0; i < p_values.length; i++) {
				p__q.setString(i,p_values[i]);
			}
		}
	}
	
	
}
